﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using Telerik.Windows.Documents.Spreadsheet.Expressions.Functions;

namespace Daq.Converters
{
    internal class DoubleToStringConverter : IMultiValueConverter
    {
        private StringBuilder _sb = new();
        private char[] buffer = new char[32]; // 足以容纳 double 的最大格式化长度
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            //if (values.Length == 2 && values[0] is double number && values[1] is int digits)
            //{
            //    // 使用 Span<char>包装缓冲区，避免数组直接操作
            //    Span<char> span = buffer.AsSpan(0, _buffer.Length);
            //    int position = 0;

            //    number.TryFormat(span.Slice(position), out int charsWritten, format: null, provider: null);

            //    // 处理正数前的空格
            //    if (number > 0)
            //    {
            //        span[position++] = ' ';
            //    }
            //    // 构建格式化字符串部分: {0:fX}
            //    span[position++] = '{';
            //    span[position++] = '0';
            //    span[position++] = ':';
            //    span[position++] = 'f';
            //    // 写入小数位数字符 (处理多位数情况)
            //    int digitsStart = position;
            //    bool hasMoreDigits;
            //    do
            //    {
            //        int digit = digits % 10;
            //        span[position++] = (char)('0' + digit);
            //        digits /= 10;
            //        hasMoreDigits = digits > 0;
            //    } while (hasMoreDigits);
            //    // 反转数字部分 (因为上面是按逆序写入的)
            //    int digitsEnd = position - 1;
            //    while (digitsStart < digitsEnd)
            //    {
            //        (span[digitsStart], span[digitsEnd]) = (span[digitsEnd], span[digitsStart]);
            //        digitsStart++;
            //        digitsEnd--;
            //    }
            //    span[position++] = '}';
            //    // 截取有效长度的格式化字符串
            //    ReadOnlySpan<char> formatSpan = span.Slice(0, position);
            //    // 使用栈分配的结果缓冲区进行格式化
            //    Span<char> resultBuffer = stackalloc char[32];
            //    if (number.TryFormat(resultBuffer, out int charsWritten, formatSpan, culture))
            //    {
            //        return new string(resultBuffer.Slice(0, charsWritten));
            //    }
            //}
            //return "";

            if (values.Length == 2 && values[0] is double number && values[1] is int digits)
            {
                _sb.Clear();
                if (number > 0)
                    _sb.Append(' ');
                _sb.Append('{');
                _sb.Append('0');
                _sb.Append(':');
                _sb.Append('f');
                _sb.Append(digits);
                _sb.Append('}');
                var str = _sb.ToString();
                return String.Format(_sb.ToString(), number);
            }
            return "";
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
